package com.link.base.base.alert.service;

import com.link.base.base.alert.model.Alert;
import com.link.core.basic.service.BasicService;

/**
 * 预警模块-头
 *
 * @author 宁蓝昊
 * @date 2019/09/28 16:03
 */
public interface AlertService extends BasicService<Alert> {

    /**预警状态*/
    class AlertStatus {
        /**新建*/
        public static final String NEW = "New";
        /**有效*/
        public static final String ACTIVE = "Active";
        /**无效*/
        public static final String INACTIVE = "Inactive";
    }


    /**预警消息类型*/
    class AlertInfo {
        /**系统消息*/
        public static final String SYS_INFO = "SysInfo";
        /**短信提醒*/
        public static final String SMS = "SMS";
    }

    /**预警接收人类型*/
    class AlertReceive {
        /**按对象条件筛选*/
        public static final String Conditional = "Conditional";
        /**指定员工*/
        public static final String Employee = "Employee";
    }

    /**预警接收人筛选字段类型*/
    class AlertField {
        /**职位*/
        public static final String POSITION = "Position";
        /**员工*/
        public static final String EMPLOYEE = "Employee";
    }


    /**预警周期*/
    class AlertLoopType {
        /**月*/
        public static final String MONTH = "Month";
        /**月*/
        public static final String WEEK = "Week";
        /**日*/
        public static final String DAY = "Day";
        /**小时*/
        public static final String HOUR = "Hour";
    }

    /**预警变量*/
    class AlertVariable {
        /**表量开始标志*/
        public static final String BEGIN_FLAG = "<<";
        /**变量结束标志*/
        public static final String END_FLAG = ">>";
        /**当前年份 ，2019*/
        public static final String CURRENT_YEAR = "current_year";
        /**当前日 ，2019-08-08*/
        public static final String CURRENT_DAY = "current_day";
        /**当前日，生日格式，08-08*/
        public static final String CURRENT_BIRTHDAY = "current_birthday";
        /**当前月，生日格式，08-08*/
        public static final String CURRENT_MONTH_BIRTHDAY = "current_month_birthday";
        /**当前时间 ，2019-08-08 23:29:29*/
        public static final String CURRENT_DATE_TIME = "current_date_time";
    }

    /**
     * 配置工作流，每小时运行一次
     * 1. 扫描处于有效时间且状态为生效的预警
     * 2. 判断当前运行时间是否处于预警周期节点，判断标准：获取当前时间（忽略分秒）与开始时间（忽略分秒）的时间差，
     *      当时间差为预警周期的整数倍时则视为需要执行的预警。
     * 3. 根据预警对象+预警判断规则逻辑，调用接口获得需要预警对象数据
     * 4. 当预警接收人为指定人员时，则单独给此人发送系统消息/短信
     * 5. 当预警接收人为按对象条件筛选时，需要配置指定字段，该字段含义为预警对象数据中的其中一个字段，
     *      为系统内用户的职位ID或者用户ID，获取此人数据发送系统消息/短信
     *
     * @author NingLanhao
     * @date 2019-10-08 11:10
     * @param
     * @return void
     * @throws Exception
     */
    void executeAlert()throws Exception;


    /**
     * 保存预警相关配置信息，保存前会校验预警规则判断逻辑维护是否合法
     *
     * @author NingLanhao
     * @date 2019-09-29 11:18
     * @param entity
     * @return void
     * @throws Exception
     */
    void saveAlert(Alert entity)throws Exception;
}
